package eee.xiang.cloud_learning.common.consistenthash;

import java.util.SortedMap;
import java.util.TreeMap;

/**
 *
 * 简易一致性hash算法原理
 * <td>
 *    将节点想象成一个圆，各节点分别落在圆上，数据也落在圆上，如果没有碰到圆上的节点则顺时针找到你下一个（利用TreeMap排序的特点）
 *    <span>防止数据倾斜（数据分布不均匀，导致个别节点超负载），可以使用虚拟节点，每个虚拟节点映射到真实节点去</span>
 * </td>
 * @author x-yin
 * @Date 2019/8/21
 */
public class NodeArray {

    private static SortedMap<Integer, Node> circleMap = new TreeMap<>();




    public static void addNode(Node node){
        circleMap.put(node.hashCode(), node);
    }

    public static void putObj(Object obj){
//        Long hash = MurMurHash.hash(obj.toString());
        int key = obj.hashCode();
        Node node = circleMap.get(key);
        if(node == null){
            SortedMap<Integer, Node> tailMap = circleMap.tailMap(obj.hashCode());
            int dataKey = tailMap.isEmpty() ? circleMap.firstKey() : tailMap.firstKey();
            node = circleMap.get(dataKey);
        }
        node.putObj(obj);
    }

    public static void getObj(Object obj){
        int key = obj.hashCode();
        Node node = circleMap.get(key);
        if(node == null){
            SortedMap<Integer, Node> tailMap = circleMap.tailMap(obj.hashCode());
            int dataKey = tailMap.isEmpty() ? circleMap.firstKey() : tailMap.firstKey();
            node = circleMap.get(dataKey);
        }
        node.getObj(key);
    }
}
